package com.innerclass_;

/**
 * @Author 小闽
 * @Date 2024/9/16 16:04
 * @PackageName: com.innerclass_
 * @ClassName: LocalInnerClass
 * @Description: 局部内部类
 * @Version 1.0
 */
public class LocalInnerClass {
    public static void main(String[] args) {
        // 创建外部类Outer02
        Outer02 outer02 = new Outer02();
        outer02.m1();
        outer02.m2();
        // 在外部其他类中想去访问内部类或创建一个对象，无法完成，因为内部类地位是一局部变量
        //Inner02 inner02 = new Inner02();
        System.out.println("n1=" + outer02);
    }
}

class Outer02{ // 外部类
    private int n1 = 100; // 属性
    public void m1(){  // 方法
        System.out.println("这是成员内部类的m1方法...");
        // 1.局部内部类是定义在外部类的局部位置，比如方法中，并且有类名。
        // 3.不能添加访问修饰符，但是可以使用final修饰。
        final class Inner02{ // 内部类（本质也是一个类）
            //如果在内部类中定义了一个和外部类一样重名的属性，那么就会遵循就近原则。
            // 如果想访问外部类的属性，则需要使用外部类名.this.成员去访问。
            private int n1 = 600;
            public void f1(){
                // 2.在内部类中的方法中，可以去访问外部类的私有属性/成员
                System.out.println("n1=" + n1 +"\n" + "Outer02的n1=" + Outer02.this.n1);
                System.out.println("n1的哈希码为：" + Outer02.this);
                m2(); // 也可以去调用方法
            }
        }
       // 4.作用域：仅仅在定义它的方法或代码块中。
        {
            // 在代码块中去定义内部类也是可以的
            class Inner03{

            }
        }
        // 5.在外部类中去访问内部类的的成员时，需要先创建内部类的对象再去访问。
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }
    public void m2(){
        System.out.println("这是外部类Outer的m2方法...");
    }
}